package main

import (
	"context"
	"fmt"
	"go-jhb-admin-api/config"
	"go-jhb-admin-api/routes"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"

	"github.com/joho/godotenv"
)

func main() {

	// 加载 .env 文件
	err := godotenv.Load()
	if err != nil {
		log.Fatal("加载.env文件失败")
	}

	// 创建一个 HTTP 服务器
	r := routes.SetupRouter()
	srv := &http.Server{
		Addr:    ":" + os.Getenv("GIN_PORT"), // 使用环境变量配置端口
		Handler: r,
	}

	// 启动 Gin 服务
	go func() {
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("ListenAndServe() 失败: %v", err)
		}
	}()

	// 初始化数据库连接
	if err := config.InitDB(); err != nil {
		log.Fatalf("数据库连接失败: %v", err)
	}

	// 初始化Redis
	config.InitRedis()

	// 捕获 SIGINT 和 SIGTERM 信号
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

	// 等待收到退出信号
	sig := <-sigs
	fmt.Println("收到信号:", sig)

	// 程序退出前，执行清理操作
	fmt.Println("正在优雅关闭服务器...")

	// 关闭服务器，超时设置为5秒
	ctx := context.TODO()
	if err := srv.Shutdown(ctx); err != nil {
		fmt.Printf("服务器关闭失败: %v\n", err)
	} else {
		fmt.Println("服务器已成功关闭")
	}

	// 关闭数据库连接
	defer config.CloseDB()

	// 程序退出
	fmt.Println("程序退出。")
}
